package com.tedu.sp11.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.tedu.sp01.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
@Slf4j
public class AccessFilter extends ZuulFilter {
    //设置过滤器的类型：pre,routing,post,error
    @Override
    public String filterType() {
        //return "pre";
        return FilterConstants.PRE_TYPE;//前置过滤器
    }

    //设置过滤器的顺序号
    @Override
    public int filterOrder() {
        //该过滤器顺序要 > 5，才能得到 serviceid
        //return FilterConstants.PRE_DECORATION_FILTER_ORDER+1;
        return 6;
    }

    /*
    * 对客户端的当前请求进行判断，
    * 针对当前请求，是否要执行过滤代码
    * */
    @Override
    public boolean shouldFilter() {
        //如果调用item-service，要执行过滤代码判断权限
        //否则不执行过滤代码

        //对指定的serviceid过滤，如果要过滤所有服务，直接返回 true
        //获取调用的服务id
        RequestContext ctx=RequestContext.getCurrentContext();//请求上下文对象
        String serviceId= (String) ctx.get(FilterConstants.SERVICE_ID_KEY);
        //判断是不是item-service
        /*if(serviceId.equals("item-service")) {
            return true;
        }
        return false;*/
        return "item-service".equalsIgnoreCase(serviceId);
    }

    //过滤代码
    @Override
    public Object run() throws ZuulException {
        //http://localhost:3001/item-service/u45y45435?token=y45435
        //获取request对象
        RequestContext ctx=RequestContext.getCurrentContext();
        HttpServletRequest request=ctx.getRequest();

        //接收token参数
        String token=request.getParameter("token");
        //如果没有收到token参数，认为用户没有登录，阻止他继续调用
        if(StringUtils.isNotBlank(token)){//if(token==null){
            //阻止他继续调用  //此设置会阻止请求被路由到后台微服务
            ctx.setSendZuulResponse(false);//不再向后台服务转发

            /*//向客户端的响应
            ctx.setResponseStatusCode(200);*/
            //设置向客户端发送的响应
            ctx.addZuulResponseHeader("Content-Type","application/json");
            //JSONResult - {code:401,msg:"not login",data:null}
            //ctx.setResponseBody(JsonResult.err().code(JsonResult.NOT_LOGIN).toString());
            ctx.setResponseBody(JsonResult.err().msg("not login").toString());
        }
        //zuul过滤器返回的数据设计为以后扩展使用，
        //目前该返回值没有被使用
        return null;//当前zull版本中，这个返回值没有任何作用
    }
}
